有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java swing焦点问题,焦点丢失,未调用focusgain

我有一个复杂而繁重的swing客户端应用程序,其中包含许多模态组件、jdialogs、内部框架等。在某些情况下,会出现问题,无法再关注swing文本字段。您可以单击一些JButton、JCheckbox,但不可能再在可编辑的jtextfields上聚焦和编辑值。可编辑文本字段的gainfocus事件不再触发,当您执行单击文本字段时,只调用requestfocus方法。 我找到了一种解决问题的方法(黑客),当问题发生时,你可以显示一些joptionpane消息或modal jdialog并通过单击或处理来关闭它,只要你点击文本字段并编辑它们,问题就会消失。 作为一个解决方案,我做了一些检查,如果你试图关注一个组件,我会在clicked textfield的requestfocus事件中启动一个计时器线程,并将实例保持为focusrequesting组件。过了一段时间,我通过

键盘管理器。getCurrentKeyboardFocusManager()。getPermanentFocusOwner()

如果没有出现问题,并且textfield获得了焦点,则返回的对象(getPermanentFocusOwner的retur值)与focusrequesting组件是同一个实例。但如果出现问题,返回的对象与请求的焦点不同,我通过以下方式打开我的临时jdialog:

JDialog dialog=new OptionPane().createDialog(KeyboardFocusManager.getCurrentFocusManager().getActiveWindow(), "");
dialog.setModal(true); 
// MUST be modal to fix the lost focus case
// start closing thread, which closes the dialog after some few time by dialog.dispose
new Closer(dialog).start();
dialog.setVisible(true);

这个机制有效,我现在不太稳定。在某些情况下,对话框。dispose()不工作,临时窗口始终保持在屏幕上,不可关闭,并且由于它是模态的,客户端无法再执行任何操作。对话框必须是模态的才能解决焦点问题,因为非模态对话框不能解决上面声明的焦点问题。jdialog的dispose方法有很多同步块、互斥对象等,我认为会出现一些死锁

有更好的机制建议和想法吗?我知道最好的解决方案是检查当前的应用程序,分析它或重写它。但它非常复杂、沉重,而且模型和视图没有很好地组织。我的时间很短,因为客户正在等待,需要一些临时解决方案、技巧或黑客


共 (1) 个答案

  1. # 1 楼答案

    You may click on some jbuttons, jcheckboxes but it is impossible to focus and edit values on editable jtextfields anymore.

    • 这是一个问题(非常常见),在JTextFieldJWindow没有父项(JFrame),使用未修饰的JDialog代替

    • 我在这里看到了FocusFocusSubsystemLinux OS和最后Java version的一些问题,但从未导致阻止用户输入JTextField

    • 解决上午问题的最佳方法是RequestFocusListenerby @camickr

    • dialog.setVisible(true);应该用invokeLater()包装,更多信息请参见Initial Thread (valid for all Top-Level Containers created on runtime too)

    • 你的问题中没有明确的内容,没有发布一个SSCCE、简短、可运行、可编译、可交易、由上午问题引起的